在這一系列的文章中,會特別介紹設計模式 (design pattern)。什麼是設計模式呢?當筆者第一次知道這四個字的時候,買了幾本工具書,看了許多文章,然後呢...沒有然後了。
不虧是專業程式設計高手寫的書,對於當時的我,完全看不懂,一頭霧水。按照書中的範例程式碼按步就班地練習了幾次,然後就忘記了。如果有更白話、貼近一般生活的解釋會不會比較好懂呢?
設計模式是程式設計的「best practice」,有的書翻成:最佳實踐、最佳實作、好習慣。總之,就是從平庸的程式設計師要寫出頂尖的程式碼必須學習的方法。它不是專屬於 PHP,因為它是一種概念、一種思考習慣,在 PHP 練習到的設計模式一樣可以用在其它的程式語言。
如同金庸的武林小說,裡頭的武林高手使用的招式,都會有個名字,例如降龍十八掌、獨孤九劍、九陰白骨爪等等。但如果這些招式沒有名字,實際上也不影響這些武林高手出招,因為那本來就是他們已經會的招式。
武林高手為了傳授弟子學習這些好招,必須記錄在紙本上,寫成武功秘笈,將招式命名,一步一步寫在裡面。
Credit: Dai-Chang Yang
只知道招式名字,沒有內化成自己的武功,是完全沒用的。(笑)
觀察了很多高手的程式碼,在他們的程式碼中會發現有類似的寫法 (武林版:招式),對於解決一些問題 (武林版:對手) 特別有效,更多程式設計人員模仿、學習這樣的寫法。有人整理了這樣的寫法 (武林版:武功秘笈),為了方便大家學習,就給了這些寫法一個名字 (武林版:招式名稱),於是有了單例 (signgleton)、工廠 (factory) 等等名字。
於是乎過了幾年,累績了經驗,回過頭看,突然明白了這是怎麼一回事。
「買了工具書,光是看,或者按照書中的範例練習,是沒用的。」
平常工作都是使用現成的框架 (framework),使用別人寫好的函式庫 (library、package),光是 if
, else
, foreach
, switch
套用別人寫好的函式庫、框架內建的功能就能應用在工作所需,不需要自己費心去造輪子,說白了沒什麼機會及動機去運用設計模式。
你必須實際把設計模式應用在自己的作品中,經過大腦的慎密思考,當在維護自己的作品時,思考如何讓作品更棒時,設計模式就會不知不覺、悄悄地內化了。甚至不需要知道用的是什麼名字的設計模式,因為它已經是內在的一部分。
而這也是筆者的系列標題「開源的技術粹練」,藉由開源自己的作品,讓自己的技術日益進步。
而工具書是必須買的。當沒有點子來最佳化自己的程式碼時,或晚上失眠睡不著時,拿來翻翻助眠(真的會幫助睡意),有時候會發現有些寫法是可以用在目前在做的東西。如此實際應用,才會把好的寫法變成自己的習慣寫法。
叫的出名字的設計模式有三十種以上,但不是每一種都很常見,除非你的作品整個專案規模非常大,否則大部分用到的機會趨於零。接下來會每天各一個篇幅來介紹以下最常見的設計模式,未來用在你的作品的機會非常高的。
我們明天見。
本文同步更新於 TerryL 部落格 Day 3 - PHP 設計模式 (Design Pattern),歡迎前往討論。